package com.sz.biz.logistics.core.service;

import com.sz.biz.logistics.core.entity.ProductRegionRel;
import com.sz.biz.logistics.core.entity.ProductServicePropertyEnum;
import com.sz.biz.logistics.core.entity.ProductServiceRel;
import com.sz.biz.logistics.core.dto.ProductServiceRelDeleteDto;
import com.sz.biz.logistics.core.dto.ProductServiceRelDto;
import com.sz.biz.logistics.core.dto.ProductServiceTypeDto;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * Function:  ProductServiceRelService <br>
 * Author: wentao.chang <br>
 * Date: 2017-04-25 14:58:00
 */

public interface ProductServiceRelService {

    /**
     * 根据服务uid获取已经上线的服务
     *
     * @param uids
     * @return
     */
    List<ProductServiceRel> findOnlineProductByServiceUids(List<String> uids);

    /**
     * 新增
     *
     * @param entry 新增的实体
     * @return 新增是否成功
     */
    Integer save(ProductServiceRelDto entry);

    /**
     * 修改产品服务信息
     * @param productServiceRel
     */
    void update(ProductServiceRelDto productServiceRel );

    /**
     * 检索产品中的主服务
     *
     * @param productId
     * @return
     */
    ProductServiceRel checkMainService(Integer productId);

    /**
     * 获取主服务，必选服务
     * @param productId
     * @param serviceTypeCode
     * @return
     */
    List<String> checkMainRequiredService(Integer productId, String serviceTypeCode);

    /**
     * 根据产品id和服务uid获取产品服务
     *
     * @param productId
     * @param serviceUid
     * @return
     */
    ProductServiceRel checkServiceByProductIdAndServiceUid(Integer productId, String serviceUid);

    /**
     * 批量新增
     *
     * @param list
     */
    void batchsave(List<ProductServiceRel> list);

    /**
     * 保存
     * @param productServiceRel
     */
    void save(ProductServiceRel productServiceRel);

    /**
     * 根据productId查询单个实体
     *
     * @param productId
     * @return 查询出来的实体对象
     */
    List<ProductServiceRel> findByProductId(int productId);

    List<ProductServiceRel> findSimpleByProductId(int productId);

    /**
     * 根据主键Id查询单个实体
     *
     * @param id 主键id
     * @return 查询出来的实体对象
     */
    ProductServiceRel findById(Integer id);

    /**
     * 根据productId删除
     *
     * @param productId productId
     */
    void deleteByProductId(Integer productId);

    /**
     * 根据产品uid和时间查询产品和服务之间的关系
     * @param uid
     * @param time
     * @param hasDisabled
     * @return
     */
    List<ProductServiceRel> findServiceDetailsByUidAndDate(String uid, Date time, boolean hasDisabled);

    /**
     * 根据产品uid和时间查询产品和服务之间的关系
     * @param uid
     * @param time
     * @return
     */
    List<ProductServiceRel> findServicesByUidAndDate(String uid, Date time);

    /**
     * 根据产品uid,服务uid和时间查询产品和服务之间的关系
     * @param productUid
     * @param time
     * @param serviceUid
     * @return
     */
    ProductServiceRel findNextServices(String productUid, Date time, String serviceUid);

    /**
     * 根据productId查询
     *
     * @param productId
     * @return
     */
    List<Map> findServicesByProductId(Integer productId);

    /**
     *  产品服务属性
     * @param productId
     * @param serviceProperties
     * @return
     */
    List<ProductServiceRel> findByProdIdAndServiceProperty(Integer productId,List<String> serviceProperties);

    /**
     * 根据产品id获取
     * @param productId
     * @return
     */
    List<ProductServiceRel> findByProdId(Integer productId);

    /**
     * 删除产品服务
     *
     * @param ids
     * @return
     */
    int batchDeleteById(List<Integer> ids);


    /**
     * 异步校验服务是否已经在产品中存在
     *
     * @param productId
     * @param serviceTypeCode
     */
    void checkServiceIsExistInProduct(Integer productId, String serviceTypeCode);

    /**
     * 同一种类型的服务在统一产品下只能有一个
     * @param productId
     * @param serviceTypeCode
     */
    void checkServiceTypeInProduct(Integer productId, String serviceTypeCode);

    /**
     * 根据产品id，产品属性获取产品服务列表
     * @return
     * @param id
     * @param optional
     */
    List<ProductServiceTypeDto> findByProductIdAndServiceProperty(Integer id, ProductServicePropertyEnum optional);

    /**
     * 根据产品ids，产品属性获取产品服务列表
     * @return
     * @param productIds
     * @param optional
     */
    List<ProductServiceTypeDto> findByProductIdsAndServiceProperty(List<Integer> productIds, ProductServicePropertyEnum optional);

    /**
     * 验证揽收地址有效性
     * @param uid
     * @param serviceUids
     *@param serviceType  @return
     */
    List<ProductRegionRel> checkReceiveAddress(String uid, List<String> serviceUids, String serviceType);

    /**
     * 删除
     * @param productServiceRelDeleteDto
     * @param deleteAll
     */
    void delete(ProductServiceRelDeleteDto productServiceRelDeleteDto, boolean deleteAll);

    /**
     * 根据产品服务id删除服务
     * @param psIds
     */
    void deleteByPsIds(List<Integer> psIds);

    /**
     * 产品可选服务列表-服务类型编码+服务类型名称
     * @param productId
     * @return
     */
    List<Map> findOptionalServiceTypes(Integer productId);
}
